本篇主要介紹 Axios
用 ajax 的方式來取資料(城市名稱),並依使用者輸入字符的不同查找不同的資料,會使用到正規表達式來處理字串。
Axios
Axios
:是 目前許多開發者所使用的 ajax libray,需要透過引入方式使用使用,詳見Axios。Axios API
有許多優點,其中一個是實作了Promise
的語法結構,讓使用者可以更有效的解析(resolve)回傳的資料。
Promise
: Promise
是一個非同步(async)操作執行後的結果
。當Promise
初始話時,狀態為等待中(pending)
,當執行 async 任務後,會回傳結果,無論成功(fulfilled)或是拒絕(rejected)皆會回傳,且不會在改變回傳的內容,所以每次執行時都會回傳新的Promise
物件。
Response
:當Promise
被解析(resolve)
後會回傳Response
物件,可以直接以.then()
方式進行串接解析,且能使用Response
提供的json()
方法取得資料。
- 資料抓取:
const endpoint = ref(
"https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json"
);
const initCities = ref([]);
onMounted(() => {
axios.get(endpoint.value).then((response) => {
initCities.value = response.data;
});
});
findMatches 函數是應用程式的核心功能之一,它負責根據使用者的輸入來篩選城市和州。這個函數使用正則表達式(RegExp)來檢查使用者輸入的文字是否與資料中的城市或州名匹配。
這個函數會回傳一個符合條件的資料陣列。如果使用者輸入空白,則回傳一個空陣列,避免無效的匹配操作。
RegExp()
:用來做正規表達試的參數, g
代表 global,i
代表 insensitive,不受大小寫影響。
const findMatches = (wordToMatch, cities) => {
if (wordToMatch === "") {
return [];
}
const regex = new RegExp(wordToMatch, "gi");
return cities.filter((place) => place.city.match(regex) || place.state.match(regex));
};
到這邊就確定可以透過findMatches()
取到特定的資料了。
接下來要把資料依照查找的字串 render 出來。
<input
type="text"
class="search"
placeholder="City or State"
@input="displayMatches"
/>
const displayMatches = (e) => {
displayCities.value = findMatches(e.target.value, initCities.value);
};
最後再處理人數的顯示處理問題。
numberWithCommas
處理正規表達式的問題,函數負責將人口數字格式化,將其轉換為帶有千分位逗號的格式(例如:1000000 -> 1,000,000),以提高數據的可讀性。const numberWithCommas = (x) => {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};
<span class="population">{{ numberWithCommas(data?.population) }}</span>